package com.neuedu.javase.collection;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;

/***
 * 项目名称:  MyJavaSE 
 * 包：  com.neuedu.javase.collection 
 * date:   2025/10/31   10:59  
 * 描述:  
 *  @author : 张金山
 *  作者博客:   https://blog.fulfill.com.cn
 */
public class MyArrayList {

    //因为数组不可边长，当数据超过数组长度的时候 需要对数组 copy  创建新数组 扩容
    public static void main(String[] args) {

        //CTRL+ 鼠标左键
        /**
         *  ArrayList 内部维护了一个数组
         *   transient Object[] elementData; // non-private to simplify nested class access
         *
         *   调用add方法 数组长度不够了 会执行 扩容的功能
         *
         *   private Object[] grow(int minCapacity) {
         *         int oldCapacity = elementData.length;
         *         if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
         *             int newCapacity = ArraysSupport.newLength(oldCapacity,
         *                     minCapacity - oldCapacity,
         *              oldCapacity >> 1          );
         *                  return elementData = Arrays.copyOf(elementData, newCapacity);
         *            } else {
         *                  return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
         *
         *
                }
         *
         *
         */

        //1 创建容器   面相接口编程
        //1.1 使用无参 的构造方法，创建一个 空白的容器
        // List list = new ArrayList();

        // 1.2 使用int 类型的参数， 初始 容器大小
        // List list1 = new ArrayList(30); //假如存在元素

        //1.3 使用 现有的集合数据 填充新的容器
        // List list2 = new ArrayList(list1);

        //2.1 创建对象   List 类型  有序， 可重复
        // List list = new ArrayList();
        //
        // Student stu1 = new Student(1 ,  "张三");
        // Student stu2 = new Student(2 ,  "李四");
        // Student stu3 = new Student(3 ,  "王五");
        // Student stu4 = new Student(4 ,  "赵六");
        //
        // //2.2 添加元素到容器中 add(Object)
        // list.add(stu1);
        // list.add(stu1);
        // list.add(stu2);
        // list.add(stu3);
        //
        // System.out.println("初始的List;  "+list);
        //
        // // 2.3 长度   list.size() = 4
        // System.out.println("list.size() = " + list.size());
        //
        //
        // System.out.println("==========================remove ==================================");
        // //2.4 删除元素
        // // list.remove(Object )  //删除指定对象   一个对象存储了多次，只会移除 第一个
        // // list.remove(index ) //删除指定下标的   返回的是 已经删除的元素
        //
        // System.out.println("list.remove(stu1) = " + list.remove(stu1));
        // System.out.println("删除完remove（Object）;  "+list);
        //
        // System.out.println("list.remove(2) = " + list.remove(2));
        // System.out.println("删除完remove（index）;  "+list);
        //
        // System.out.println("==========================判断集合中元素的方法 ==================================");
        //
        // List list1 = new ArrayList();
        //
        // //不可改
        // List list2 = Arrays.asList(stu1, stu2);
        // List list3 = Arrays.asList(stu1, stu2,stu4);
        //
        // list1.add(stu1);
        // list1.add(stu2);
        // list1.add(stu3);
        // System.out.println("list1 = " + list1);
        // System.out.println("list2 = " + list2);
        // System.out.println("list3 = " + list3);
        // System.out.println("list1.contains(stu1) = " + list1.contains(stu1));   //true
        // System.out.println("list1.contains(stu4) = " + list1.contains(stu4));   //false
        //
        // System.out.println("list1.containsAll(list2) = " + list1.containsAll(list2));  //true
        // System.out.println("list1.containsAll(list3) = " + list1.containsAll(list3));  // false
        //
        // System.out.println("list1 = " + list1);
        // System.out.println("list1.isEmpty() = " + list1.isEmpty());  //false
        //
        // list1.clear();//清空元素
        // System.out.println(" list1.clear(); = " + list1);
        // System.out.println("list1.isEmpty() = " + list1.isEmpty());  //true
        //
        //
        // System.out.println("===================retainAll============================");
        // list1.add(stu1);
        // list1.add(stu2);
        // list1.add(stu3);
        // System.out.println("retainAll before list1 = " + list1);
        // System.out.println("retainAll before list2 = " + list2);
        // list1.retainAll(list2);
        // System.out.println("retainAll after list1 = " + list1);
        // System.out.println("retainAll after list2 = " + list2);


        //集合的遍历

        List list5 = new ArrayList(   Arrays.asList(new Student(1 ,  "张三"), new Student(2 ,  "李四"), new Student(3 ,  "王五"))   );
        // Object[] array = list5.toArray();
        // for (int i = 0; i < array.length; i++) {
        //     System.out.println("使用数组遍历array[i] = " + array[i]);
        // }



        //使用迭代器遍历
        // Iterator iterator = list5.iterator();
        // while (iterator.hasNext()){
        //     Object element = iterator.next();
        //     System.out.println(" while (iterator.hasNext()){ element = " + element);
        // }
        // for(   Iterator it = list5.iterator()    ;  it.hasNext()        ;    ){
        //     System.out.println("for  + Iterator ： "+it.next());
        // }

        // list5.get(index)  获取指定下标的元素   配合size 做遍历
        // System.out.println("list5.get(0) = " + list5.get(0));
        // System.out.println("list5.get(1) = " + list5.get(1));

        // for (int i = 0; i < list5.size(); i++) {
        //     System.out.println("list5.get("+i+") = " + list5.get(i));
        // }


        //JDK 5+   对数组、集合  Set、List
        // for( Object el: list5   ){
        //     System.out.println(" for( Object el: list5   ){ "+el);
        // }

        // int ages[] = new int[]{100,200,300};
        // for( int age: ages   ){
        //     System.out.println("  for( int age: ages   ){  "+age);
        // }



        //forEach  java 8 提供的函数式接口
        // list5.forEach(new Consumer() {
        //     @Override
        //     public void accept(Object o) {
        //         System.out.println(o);
        //     }
        // });



        //函数式接口可以省略
        // list5.forEach(
        //   (Object o) ->{
        //         System.out.println(o);
        //     }
        // );


        //简写，省略 参数括号 类型
        // list5.forEach(
        //          item->{
        //             System.out.println(item);
        //         }
        // );

        //简写，省略 参数括号 类型
        // list5.forEach(
        //         item->  System.out.println(item)
        // );

        //forEach 需要的就是一个  接受参数的方法
        list5.forEach(   System.out::println   );


    }
}


class Student {


    private Integer id ;
    private String name ;

    public Student() {
    }

    public Student(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
